
package com.ruoyi.client.service.impl;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ruoyi.client.mapper.CartMapper;
import com.ruoyi.client.pojo.form.BatchIdsForm;
import com.ruoyi.client.pojo.form.CartAddForm;
import com.ruoyi.client.pojo.form.CartUpdateForm;
import com.ruoyi.client.pojo.vo.CartVo;
import com.ruoyi.client.service.ICartService;
import com.ruoyi.client.service.IGoodsService;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.myshop.domain.Cart;
import com.ruoyi.myshop.domain.Goods;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service("ClientCartServiceImpl")
public class CartServiceImpl implements ICartService {

    @Resource(name = "ClientCartMapper") //注入指定命名的Bean
    private CartMapper cartMapper;
    @Resource
    private IGoodsService goodsService;

    /**
     * 增加商品至购物车中
     */
    @Override
    public Boolean add(CartAddForm form) {
        // 检查当前登录用户Id
        Long userId = StpUtil.getLoginIdAsLong();
        // 初始购物车对象
        Cart cart = new Cart();
        BeanUtils.copyProperties(form, cart);
        cart.setUserId(userId);
        //检查商品是否存在
        Goods goods = goodsService.selectByPrimaryKey(form.getGoodsId());
        if (goods == null) {
            throw new ServiceException("商品不存在");
        }
        //超出单个商品的最小数量
        if (cart.getCount() < 1) {
            throw new ServiceException("商品数量不能小于1");
        }

        //购物车商品不能有重复项,如果重复，则累加数量
        Cart cartDb = cartMapper.selectByUserIdAndGoodsId(cart.getUserId(), cart.getGoodsId());
        if (ObjectUtil.isNotNull(cartDb)) {
            //数据库中已有记录，则累加//
            long count = cartDb.getCount() + cart.getCount();
            cartDb.setCount(count);
            return cartMapper.update(cartDb) > 0;
        } else {
            //数据库中没有记录，新增
            //保存记录,并返回
            cart.setId(null);
            return cartMapper.insert(cart) > 0;
        }
    }

    /**
     * 删除购物车中的商品
     */
    @Override
    public Boolean deleteById(Long id) {
        // 用户登录验证,未登录会抛出例外NotLoginException
        StpUtil.checkLogin();

        return cartMapper.deleteByPrimaryKey(id) > 0;
    }

    /**
     * 删除购物车中的商品（多个）
     */
    @Override
    public Boolean deleteBatch(BatchIdsForm form) {
        // 用户登录验证,未登录会抛出例外NotLoginException
        StpUtil.checkLogin();

        //检查参数
        if (form == null || form.getIds().length < 1) {
            throw new ServiceException("参数错误");
        }
        return cartMapper.deleteBatch(form.getIds()) > 0;
    }

    /**
     * 删除购物车中的商品（我的全部）
     */
    @Override
    public Boolean deleteAllByMy() {
        // 检查当前登录用户Id
        Long userId = StpUtil.getLoginIdAsLong();
        return cartMapper.deleteByUserId(userId) > 0;
    }


    /**
     * 更改购物车项 （数量、是否勾选）
     */
    @Override
    public Boolean update(CartUpdateForm form) {
        // 用户登录验证,未登录会抛出例外NotLoginException
        StpUtil.checkLogin();

        Cart cart = new Cart();
        BeanUtils.copyProperties(form, cart);
        if(form.getIsChecked()!=null){
            cart.setIsChecked(form.getIsChecked() ? 1 :0); //数据类型转换
        }

        //更改记录,并返回
        return cartMapper.update(cart) > 0;
    }

    /**
     * 更改我的购物车全部项是否勾选 用户全选/全不选
     */
    @Override
    public Boolean updateIsCheckedAll(Boolean isChecked) {
        // 检查当前登录用户Id
        Long userId = StpUtil.getLoginIdAsLong();
        return cartMapper.updateIsCheckedAllByUserId(userId,isChecked) > 0;
    }

    /**
     * 查询我的购物车列表
     */
    @Override
    public List<CartVo> listByMy() {
        // 检查当前登录用户Id
        Long userId = StpUtil.getLoginIdAsLong();

        return cartMapper.listByUserId(userId);
    }

    /**
     * 查询我的购物车列表（已勾选的）
     */
    @Override
    public List<CartVo> listIsCheckedByMy() {
        // 检查当前登录用户Id
        Long userId = StpUtil.getLoginIdAsLong();

        return cartMapper.listIsCheckedByUserId(userId);
    }




}
